package model

import (
	"database/sql/driver"
	"encoding/json"
	"gorm.io/gorm"
	"time"
)

// BaseModel 基本信息模型
type BaseModel struct {
	ID        int32          `gorm:"primary_key"` //这里跟grpc的类型对齐
	CreatedAt time.Time      `gorm:"column:add_time"`
	UpdatedAt time.Time      `gorm:"column:update_time"`
	DeletedAt gorm.DeletedAt `gorm:"index"`
}

// CateGory  产品分类模型
type CateGory struct {
	//数据库基本信息
	BaseModel
	//类别名称
	Name string `gorm:"type:varchar(32);not null"`
	//级别
	Level int32 `gorm:"type:int;default:1"`
	//父类ID
	ParentCategoryID int32 `gorm:"type:int"`
	//父类分类
	ParentCategory *CateGory
	//父类集合  这里长个记性.如果是主外键约束的话需要字段与结构体中的字段一致.(字符也不能错
	SubCategory []*CateGory `gorm:"foreignKey:ParentCategoryID;references:ID"`
}

// ProductCategoryBrand 品牌分类模型
type ProductCategoryBrand struct {
	BaseModel
	//品牌id
	BrandID int32
	//产品分类id
	CategoryID int32
	Brand      Brand
	Category   CateGory
}

// Brand 品牌模型
type Brand struct {
	//数据库基本属性信息
	BaseModel
	//品牌名称
	Name string `gorm:"type:varchar(32);not null"`
	//logo地址信息
	Logo string `gorm:"type:varchar(256);not null;default:''"`
}

// Advertise 广告信息模型
type Advertise struct {
	BaseModel
	//第几个广告位默认是1号广告位
	Index int32 `gorm:"type:int;not null;default:1"`
	//展示图片地址
	Image string `gorm:"type:varchar(256);not null"`
	//跳转链接
	Url string `gorm:"type:varchar(256);not null"`
	//排序
	Sort int32 `gorm:"type:int;not null;default:1"`
}

// Product 商品模型
type Product struct {
	BaseModel
	//商品ID
	CateGoryID int32 `gorm:"type:int;not null"`
	//商品对应的种类
	CateGory CateGory
	//商品对应的品牌ID
	BrandID int32 `gorm:"type:int;not null"`
	//商品对应的品牌信息
	Brand Brand
	//是否正在销售,商品销售状态信息
	Selling bool `gorm:"default:false;not null"`
	//是否包邮
	ShipFree bool `gorm:"default:false;not null"`
	//商品是否热卖
	IsPop bool `gorm:"default:false;not null"`
	//是否是新品
	IsNew bool `gorm:"default:false;not null"`
	//商品名称
	Name string `gorm:"type:varchar(64);not null"`
	//二维条码
	SN string `gorm:"type:varchar(64);not null"`
	//多少人想要
	FavNum int32 `gorm:"type:int;default:0"`
	//商品真实售卖数量
	SoldNum int32 `gorm:"type:int;default:0"`
	//定价
	Price float32 `gorm:"not null"`
	//售价
	RealPrice float32 `gorm:"not null"`
	//商品简介
	ShortDesc string `gorm:"type:varchar(256);not null"`
	//商品图片url地址
	Image MyList `gorm:"type:varchar(1024);not null"`
	//商品原图片???
	DescImage MyList `gorm:"type:varchar(1024);not null"`
	//商品封面
	CoverImage string `gorm:"type:varchar(256);not null"`
}

type MyList []string

// Value 将传入的myList进行序列化重写了 是要求的方法??谁要求的?
func (myList MyList) Value() (driver.Value, error) {
	return json.Marshal(myList)

}

// Scan 传入的byte切片进行反序列化
func (myList MyList) Scan(v interface{}) error {
	return json.Unmarshal(v.([]byte), &myList)
}
